package com.alpha.core.http;

import java.util.Collections;
import java.util.Map;
import java.util.Optional;

/**
 * 请求上下文
 *
 * @author chenruwan
 * @since 2022-01-01
 */
public class AlphaHttpContext {
    private AlphaHttpContext() {
    }

    protected static ThreadLocal<Map<String, Object>> contexts = new ThreadLocal<>();

    /**
     * 设置请求上下文信息
     *
     * @param context 请求上下文
     */
    public static void setContext(Map<String, Object> context) {
        contexts.set(context);
    }

    /**
     * 获取请求上下文信息
     *
     * @return 请求上下文
     */
    public static Map<String, Object> getContext() {
        return contexts.get();
    }

    /**
     * 清空上下文
     */
    public static void clear() {
        contexts.remove();
    }

    /**
     * 获取上下文中指定属性值
     *
     * @param attr 属性名
     * @return 属性值
     */
    public static Object getAttribute(String attr) {
        return Optional.ofNullable(contexts.get()).orElse(Collections.emptyMap()).get(attr);
    }

    /**
     * 获取上下文中指定属性值（String）
     *
     * @param attr 属性名
     * @return 属性值
     */
    public static String getAttributeAsString(String attr) {
        return (String) getAttribute(attr);
    }

    /**
     * 获取上下文中的用户名
     *
     * @return 用户名
     */
    public static String getUsername() {
        return getAttributeAsString(HttpConstants.CLAIM_USER_NAME);
    }

    /**
     * 获取上下文中的用户 Id
     *
     * @return 用户Id
     */
    public static String getUserId() {
        return getAttributeAsString(HttpConstants.CLAIM_USER_ID);
    }

    /**
     * 获取上下文中的租户 Id
     */
    public static String getTenantId() {
        return getAttributeAsString(HttpConstants.CLAIM_TENANT_ID);
    }

    /**
     * 获取上下文中的客户端 Id
     */
    public static String getClientId() {
        return getAttributeAsString(HttpConstants.HEADER_CLIENT_ID);
    }

    /**
     * 获取上下文中的客户端名称
     */
    public static String getClientName() {
        return getAttributeAsString(HttpConstants.HEADER_CLIENT_NAME);
    }
}
